"""
    字符串、列表、元组、字典常用的操作方法
"""
str1 = "qwer元旦r节r快乐ASDF！@#$%^w"

# 查看字符串的长度
print(len(str1))  # 19
# 通过字符串的索引获取元素值
# 字符串的下标值默认从0开始
print(str1[1])
print(str1[3])
print(str1[0])
print(str1[18])
# 元素的索引可以使用负数进行获取
# 默认-1代表最后一个元素
print(str1[-1])
print(str1[-3])
# 字符串通过切片获取多个元素值
print(str1[0:4])
# 切片即使未获取到数据也不会报错
print(str1[-3:-4])  # 为空，因为通过索引值默认从左往右取值，如果没有交集那么不能获取实际元素值
print(str1[19:])  # 切片，索引即使越界也不会报错，打印结果：为空
# print(str1[19])  # 索引越界会报错 IndexError: string index out of range
# 步长
# 步长规律：步长为n，间隔n-1个元素取值
# 进行切片操作的时候可以隔着取元素值，步长默认为1
print(str1[1:9:2])  # wr旦快

# 字符串常用的操作方法
# 查找字符串中具体某个元素的索引
# 当出现有多个w时，只能返回一个，即从左遇见的第一个w
print(str1.find("w"))  # 1
# 使用rfind(),也是返回一个，即从右开始遇见的第一个w
print(str1.rfind("w"))
print("当出现有多个r时，只能返回一个，即从左遇见的第一个r")
print(str1.index("r"))  # 3
# 使用rindex(),也是返回一个，即从右开始遇见的第一个r
print(str1.rindex("r"))
# 替换字符串中具体元素值
# str1 = str1.replace("q", "6")  # 第一个参数是旧字符串，第二个参数是新字符串
print(str1)
# 字符串切割方法：按照字符中指定的元素值进行切割，返回一个列表，切割元素在列表当中
print(str1.split(" "))  # 按空格进行切割
# 字符串首字母大写其他英文转小写
print(str1.title())  # Qwer元旦节快乐Asdf！@#$%^
# 判断字符串是否以某个元素开头或者结尾，可以有多个元素判断
print(str1.startswith("1"))  # 判断是否以数字1开头
print(str1.endswith("^"))  # 判断是否以^结尾

str2 = " qw er one "

print(str2)

# 去除字符串中左右两边的空格
print(str2.strip())
# 去除字符串中左边的空格
print(str2.lstrip())
# 去除字符串中右边的空格
print(str2.rstrip())
# 字符串中间的空格可以通过replace进行去除
print(str2.replace(" ", ""))
# 判断字符串是否由纯数字组成
print(str2.isdigit())
# 判断字符串是否纯英文，大小写都可以
print(str2.isalpha())
# 字符串拼接：使用语法跟之前的方法调用不一样
print("---".join(str2))  # 可以指定某个具体的字符拼接原来的每个元素

# 列表常用的操作方法
# 列表的切片也支持步长操作，常用的操作是反转列表
list1 = ["I", "Love", "You"]
print(list1.index("Love"))  # 通过元素值获取索引值
# print(list1[::-1])
# 如果步长为-1那么将容器类型的数据直接反转，如果是-2会反转之后隔着取值
# 修改列表
# list1[1]="love"
# 对列表的操作是针对原生数据进行修改操作，所以修改完之后需要打印原来的数据
# print(list1)
# 删除数据
# list1.remove("Love")
print(list1)
# 使用del关键字删除，通过索引提取元素
# del list1[-1]
# print(list1)
# 清空列表数据
# list1.clear()
# print(list1)

# 增加数据
list1 = ["胡歌", "刘亦菲", "彭于晏", "唐嫣"]
# 1.增加数据使用append方法进行添加，默认数据加到列表的末尾
list1.append("123")
print(list1)
# 会将整个列表当做一个元素添加进去
# list1.append(["杨幂", "教主", "刘诗诗"])
print(list1)  # ['胡歌', '刘亦菲', '彭于晏', '唐嫣', '123', ['杨幂', '教主', '刘诗诗']]
# 列表嵌套提取元素值
print(list1[-1][2])  # 刘诗诗
# 添加容器类型的数据全部分开添加不是整个元素
# 使用extend方法可以将容器类型的数据拆分逐步添加进去
# list1.extend(["杨幂", "教主", "刘诗诗"])
# print(list1)  # ['胡歌', '刘亦菲', '彭于晏', '唐嫣', '123', '杨幂', '教主', '刘诗诗']
list1.extend((1, 2, 3, 4, 5, "明明"))
print(list1)

# 元组常用操作方式
# 元组和列表一样是有序的容器类型数据，那么也支持索引和切片操作
#
t1 = (1, 2, 3, 4, 5, 1)
print(t1[2])
print(t1[2:])  # (3, 4, 5)
print(t1[2:-1])  # (3, 4)
# 统计元素值出现的次数count，所有容器类型的数据
print(t1.count(1))  # 2
# 通过元素值获取索引
print(t1.index(5))

# 字典常用的操作方法
dict1 = {"name": "狗领导", "age": 80}
# 获取字典中所有的键
print(dict1.keys())  # dict_keys(['name', 'age'])
print(type(dict1.keys()))  # <class 'dict_keys'>
print(len(dict1.keys()))  # 2
# 获取字典中所有的值
print(dict1.values())  # dict_values(['狗领导', 80])
print(type(dict1.values()))  # <class 'dict_values'>
print(len(dict1.values()))  # 2
# 获取字典中所有的键值对
print(dict1.items())

# 快速创建一个字典
dict2 = dict(a=1, b=2, c=3)
print(dict2)  # {'a': 1, 'b': 2, 'c': 3}
print(type(dict2))  # <class 'dict'>
# 给字典加键值对
dict2.update({"d": 4})
print(dict2)  # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# 如果字典中有键，那么会覆盖原来的值
dict2.update({"a": "崔猷", "f": 6})
print(dict2)  # {'a': '崔猷', 'b': 2, 'c': 3, 'd': 4, 'f': 6}
# 如果字典中有键，那么不会覆盖原来的值，使用默认值
dict2.setdefault("a", 666)
print(dict2)  # {'a': '崔猷', 'b': 2, 'c': 3, 'd': 4, 'f': 6}
dict2.setdefault("k", 999)
print(dict2)  # {'a': '崔猷', 'b': 2, 'c': 3, 'd': 4, 'f': 6, 'k': 999}
# 修改数据
dict2["c"] = "one"
print(dict2)  # {'a': '崔猷', 'b': 2, 'c': 'One', 'd': 4, 'f': 6, 'k': 999}
# 删除数据
# 使用pop方法进行删除指定的键对应的键值对
dict2.pop("b")
print(dict2)  # {"a":666,"c":3}
# 也可以使用clear方式清楚字典所有键值对
# dict2.clear()
# print(dict2)

# 使用关键字del
del dict2["a"]
print(dict2)

# 集合的特性是没有重复的数据，自动去重
set1 = {1, 2, 3, 2, 1, 2, 3, 1, 3, 5, 6, 8, 4, 2, 1}
print(set1)  # {1,2,3,4,5,6,8}
print(len(set1))  # 去重之后只有7个数据

# 集合中可以添加数据，前提：已存在的数据无法添加
set1.add(7)
set1.add(1)
print(set1)
# 删除数据
set1.remove(7)
# print(set1)
# 如果删除一个没有的元素值，那么会报错
set1.remove(10)#KeyError: 10
print(set1)